package bluenext;

import lejos.pc.comm.NXTComm;
import lejos.pc.comm.NXTCommException;
import lejos.pc.comm.NXTCommFactory;
import lejos.pc.comm.NXTInfo;

/**
 * Représente un robot NXT au sein de la librairie.
 * Elle n'est pas accessible en dehors du package et donc par les applications
 * utilisant BlueNeXT.
 * 
 * @author Arnaud Hittos
 * @version 1.0
 */
class NXT {

    /** Les informations du robot (adresse et nom) */
    private NXTInfo infos;
    /** Représente l'état de la connexion au robot */
    private boolean connected;
    /** Représente la communication avec le robot */
    private NXTComm nxtComm;

    /**
     * Constructeur de base.
     */
    NXT() throws ErreurNXTException {
        this.infos = null;
        connected = false;
        try {
            this.nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
        } catch (NXTCommException e) {
            throw new ErreurNXTException("La création de la communication Bluetooth a echoué", ErreurNXTException.ERREUR_CREATION_OBJET_NXT);
        }
    }

    /** 
     * Construit l'objet <code>NXT</code> à partir d'une adresse et d'un nom.
     * @param inf les infos sur l'adresse et le nom
     */
    NXT(NXTInfo inf) throws ErreurNXTException {
        this.infos = inf;
        connected = false;
        try {
            this.nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
        } catch (NXTCommException e) {
            throw new ErreurNXTException("La création de la communication Bluetooth a echoué", ErreurNXTException.ERREUR_CREATION_OBJET_NXT);
        }
    }

    /**
     * Retourne les informations sur l'adresse et le nom du NXT.
     * @return l'objet <code>NXTInfo</code> contenant les informations du NXT.
     */
    NXTInfo getInfos() {
        return infos;
    }

    /**
     * Modifie le NXTInfo du NXT
     * @param infos les informations à mettre à jour
     */
    void setInfos(NXTInfo infos) {
        this.infos = infos;
    }

    /**
     * Retourne l'objet représentant le communication avec le robot.
     * @return l'objet <code>NXTComm</code> représentant la communication.
     */
    NXTComm getNxtComm() {
        return nxtComm;
    }

    /**
     * Modifie l'objet <code>NXTComm</code> du robot.
     * @param nxtComm la communication à mettre à jour
     */
    void setNxtComm(NXTComm nxtComm) {
        this.nxtComm = nxtComm;
    }

    /**
     * Donne l'état de la connexion au robot.
     * @return <code>true</code> si le robot NXT est connecté, <code>false</code> sinon
     */
    boolean isConnected() {
        return connected;
    }

    /**
     * Modifie l'état de connexion au robot.
     * @param connect <code>true</code> si la connexion est active, <code>false</code> sinon
     */
    void setConnectedState(boolean connect) {
        connected = connect;
    }
}
